package bbb.ccc;

import java.util.ArrayList;
import java.util.List;

import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;

import bbb.BallInfo;
import bbb.sss.Utils;

public class Encoder {

	public static Integer CODE_MAXIMAL = 17721088;

	public static Integer format(BallInfo bi) {
		int ret = 1;
		List<Integer> red = bi.toRedList();
		Integer blue = bi.getBlue();
		if (blue > 1) {
			ret += Utils.c(33, 6) * (blue - 1);
		}

		if (red.get(5) > 6) {
			ret += Utils.c(red.get(5) - 1, 6);
		}

		if (red.get(4) > 5) {
			ret += Utils.c(red.get(4) - 1, 5);
		}

		if (red.get(3) > 4) {
			ret += Utils.c(red.get(3) - 1, 4);
		}

		if (red.get(2) > 3) {
			ret += Utils.c(red.get(2) - 1, 3);
		}

		if (red.get(1) > 2) {
			ret += Utils.c(red.get(1) - 1, 2);
		}

		if (red.get(0) > 1) {
			ret += Utils.c(red.get(0) - 1, 1);
		}

		return ret;
	}

	public static BallInfo parse(Integer code) {
		BallInfo bi = null;
		if (code >= 1 && code <= CODE_MAXIMAL) {
			bi = new BallInfo();
			long blue = (code - 1) / Utils.c(33, 6) + 1;
			bi.setBlue((int)blue);

			int[] red = new int[6];
			long temp = (code - 1) % Utils.c(33, 6);
			int curIndex = 6;
			int position = 33;
			while (curIndex > 0) {
				if(position > curIndex){
					long ccc = Utils.c(position - 1, curIndex);
					if (ccc <= temp) {
						temp -= ccc;
						red[curIndex - 1] = position;
						curIndex--;
					}
				}else{
					red[curIndex - 1] = position;
					curIndex--;
				}
				position--;
			}
			bi.setRed1(red[0]);
			bi.setRed2(red[1]);
			bi.setRed3(red[2]);
			bi.setRed4(red[3]);
			bi.setRed5(red[4]);
			bi.setRed6(red[5]);
		}
		return bi;
	}

	public static List<BallInfo> randomBallList(int number){
		List<BallInfo> result = new ArrayList<BallInfo>();
		for(int i = 0 ; i < number ; i++){
			result.add(randomBall());
		}
		return result;
	}
	
	public static BallInfo randomBall(){
		return parse(Utils.randomNumber(CODE_MAXIMAL));
	}
	public static void main(String[] args) {
		// System.out.println(p(10, 3));
		// System.out.println(c(10, 3));
		// BallInfo bi = new BallInfo();
		// bi.setRed1(1);
		// bi.setRed2(2);
		// bi.setRed3(3);
		// bi.setRed4(4);
		// bi.setRed5(5);
		// bi.setRed6(6);
		// bi.setRed1(1);
		// bi.setRed2(29);
		// bi.setRed3(30);
		// bi.setRed4(31);
		// bi.setRed5(32);
		// bi.setRed6(33);
		// bi.setBlue(16);
		// System.out.println(Encoder.format(bi));
		//
		// BallInfo bi1 = parse(CODE_MAXIMAL);
		// System.out.println(bi1);

		for (int i = 1; i <= CODE_MAXIMAL; i++) {
			BallInfo pb1 = parse(i);
			Integer j = format(pb1);
			if(i!=j){
				System.out.println(i + ":" + pb1 + ":" + j);
			}
		}
	}
}
